package com.apexedu.theme.service.Impl;

import com.apexedu.framework.service.impl.AbstractBaseServiceSupport;
import com.apexedu.framework.util.Pager;
import com.apexedu.framework.util.SeqFactory;
import com.apexedu.identity.entity.TSysUser;
import com.apexedu.theme.action.AucThemeManageAction;
import com.apexedu.theme.entity.TXxfbZt;
import com.apexedu.util.FileUtil;
import com.apexedu.util.StringUtil;
import com.apexedu.util.ZipUtil;
import org.springframework.stereotype.Service;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 * 门户主题管理
 * Created by 建 on 2015/4/7.
 * 主要实现主题包的上传、删除操作。
 */
@Service("aucThemeManageService")
public class AucThemeManageServiceImpl extends AbstractBaseServiceSupport {

    /**
     * 上传主题包，保存、修改主题信息
     * @param o
     * @throws Exception
     */
    @Override
    public void saveOrUpdate(Object o) throws Exception {
        AucThemeManageAction action = (AucThemeManageAction) o;
        TXxfbZt xxfbZt=action.getXxfbZt();
        if(null!=xxfbZt){
            if(StringUtil.isNotBlank(xxfbZt.getWid())){//执行更新操作
                baseDao.update(xxfbZt);
            }else{//执行保存操作
                SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                TSysUser tSysUser=action.getLoginuser();
                xxfbZt.setCjsj(format.parse(format.format(new Date())));//创建时间
                xxfbZt.setUserid(tSysUser.getUserid());
                xxfbZt.setWid(SeqFactory.getNewSequenceAlone());
                File file = action.getZtb();
                if (null != file) {//需要上传主题包压缩文件
                    String fileName = action.getZtbFileName();
                    String newFileName=xxfbZt.getZtbm();
                    String fileUrl = FileUtil.saveFile(file, "cms/theme", fileName, newFileName);//文件保存路径
                    String savePath=action.getSession().getServletContext().getRealPath("");//项目根路径
                    String separator= File.separator;
                    fileUrl=savePath+separator+fileUrl;
                    savePath=savePath+separator+"theme"+separator+newFileName+separator;
                    UnZip(fileUrl,savePath);//解压文件到指定路径
                }
                baseDao.save(xxfbZt);
            }
        }

    }

    @Override
    public void load(Object o) throws Exception {
        AucThemeManageAction action=(AucThemeManageAction)o;
        String wid=action.getWid();
        if(StringUtil.isNotBlank(wid)){
            TXxfbZt tXxfbZt=baseDao.findById(TXxfbZt.class,wid);
            action.setXxfbZt(tXxfbZt);
        }
    }

    @Override
    public List<?> list(Object o, Pager pager) throws Exception {
        AucThemeManageAction action = (AucThemeManageAction) o;
        TXxfbZt tXxfbZt = action.getXxfbZt();
        StringBuilder hql = new StringBuilder(" from TXxfbZt t where 1 = 1 ");
        TSysUser user=action.getLoginuser();
        List<Object> params = new LinkedList<Object>();
        if (null != tXxfbZt) {
            if (StringUtil.isNotBlank(tXxfbZt.getZtmc())) {
                hql.append(" and t.ztmc like ? ");
                params.add("%" + tXxfbZt.getZtmc() + "%");
            }
        }
        if(null!=user){
            if(!user.getUsertype().equals("0")){//非管理员
                hql.append(" and t.userid = ? ");
                params.add(user.getUserid());
            }
        }
        hql.append(" order by t.ordernum desc ");
        List<TXxfbZt> list = baseDao.findByHql(hql.toString(), params.toArray());
        action.setZtList(list);
        return null;
    }

    @Override
    public boolean remove(Object o) throws Exception {
        AucThemeManageAction action=(AucThemeManageAction)o;
        String wid=action.getWid();
        if(StringUtil.isNotBlank(wid)){
            TXxfbZt tXxfbZt=baseDao.findById(TXxfbZt.class,wid);
            if(null!=tXxfbZt){
                //首先删除主题文件
                String ztmb=tXxfbZt.getZtbm();//获取主题编码
                String path=action.getSession().getServletContext().getRealPath("");//获取项目根路径
                String separator= File.separator;
                path=path+separator+"theme"+separator+ztmb;
                DeleteFolder(path);
                baseDao.deleteAll("TXxfbZt","wid","=",wid);
            }
        }
        return false;
    }

    /**
     * 解压主题包
     * @param filePath//主题保存路径
     * @param savePath//主题家业后的路径
     * @return
     */
    private void UnZip(String filePath,String savePath){
        ZipUtil.unZip(filePath, savePath, false);
    }

    /**
     * 删除目录（文件夹）以及目录下的文件
     * @param   sPath 被删除目录的文件路径
     * @return  目录删除成功返回true，否则返回false
     */
    public boolean deleteDirectory(String sPath) {
        //如果sPath不以文件分隔符结尾，自动添加文件分隔符
        if (!sPath.endsWith(File.separator)) {
            sPath = sPath + File.separator;
        }
        File dirFile = new File(sPath);
        //如果dir对应的文件不存在，或者不是一个目录，则退出
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        boolean flag = true;
        //删除文件夹下的所有文件(包括子目录)
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            //删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag) break;
            } //删除子目录
            else {
                flag = deleteDirectory(files[i].getAbsolutePath());
                if (!flag) break;
            }
        }
        if (!flag) return false;
        //删除当前目录
        if (dirFile.delete()) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * 删除单个文件
     * @param   sPath    被删除文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public boolean deleteFile(String sPath) {
        boolean  flag = false;
        File file = new File(sPath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists()) {
            file.delete();
            flag = true;
        }
        return flag;
    }

    /**
     *  根据路径删除指定的目录或文件，无论存在与否
     *@param sPath  要删除的目录或文件
     *@return 删除成功返回 true，否则返回 false。
     */
    public boolean DeleteFolder(String sPath) {
        boolean flag = false;
        File file = new File(sPath);
        // 判断目录或文件是否存在
        if (!file.exists()) {  // 不存在返回 false
            return flag;
        } else {
            // 判断是否为文件
            if (file.isFile()) {  // 为文件时调用删除文件方法
                return deleteFile(sPath);
            } else {  // 为目录时调用删除目录方法
                return deleteDirectory(sPath);
            }
        }
    }

    /**
     * 检查主题编码是否已经存在
     * @param o
     * @return 返回结果
     */
    public String checked(Object o){
        AucThemeManageAction action=(AucThemeManageAction)o;
        String ztbm=action.getRequest().getParameter("ztbm");
        if(StringUtil.isNotBlank(ztbm)){
            TXxfbZt xxfbZt=baseDao.findBean("from TXxfbZt t where t.ztbm = ? ",ztbm);
            if(null!=xxfbZt) return null;//已经存在
            return "OK!";
        }
        return null;
    }

}
